import getUserTempId from "@/utils/userTempId"
import { reqLogin, reqUserInfo, reqLogout } from "@/api"
import {
  SET_USERTOKEN_STATE,
  SET_USERINFO_STATE,
  RESET_USER_STATE,
} from "../module_type"
import { getToken, setToken, removeToken } from "@/utils/token"
const state = {
  userTempId: getUserTempId(), //保存用户未登录时的临时ID
  token: getToken() || "", //保存用户登录后的token
  userInfo: {}, //保存从后端请求回来的用户信息
}

const mutations = {
  //1. 修改vuex数据token的值
  [SET_USERTOKEN_STATE](state, payload) {
    state.token = payload.token
    //持久化保存用户token
    setToken(payload.token)
  },
  //2.修改vuex数据userInfo的值
  [SET_USERINFO_STATE](state, payload) {
    state.userInfo = payload.userInfo
  },
  //3.退出登录后清空token和相关用户信息
  [RESET_USER_STATE](state) {
    state.token = "" //清除token
    state.userInfo = {} //清除用户信息
    removeToken() //清除持久化存储的token
  },
}

const actions = {
  //1.登录请求获取token
  async reqlogin({ commit }, userInfo) {
    try {
      const res = await reqLogin(userInfo)
      // console.log(res)
      commit(SET_USERTOKEN_STATE, res)
    } catch (error) {
      alert(error.message)
      //添加一个失败的Promise,这样就算是异常了,可以让调用函数的地方得到一个失败的Promise进行异常处理
      return Promise.reject()
    }
  },
  //2.请求用户信息
  async getUserInfo({ commit }) {
    try {
      const res = await reqUserInfo()
      // console.log(res)
      commit(SET_USERINFO_STATE, { userInfo: res })
    } catch (error) {
      alert(error.message)
      //因为当前函数已经使用try处理异常了,所以在调用函数的地方无法得到异常存在,所以需要我们在catch的位置进行抛出失败的promise,则当前函在失败的情况下就会返回失败的promise
      return Promise.reject()
    }
  },
  //3.退出登录的请求
  async getLogout({ commit }) {
    try {
      await reqLogout()
      alert("退出登录成功")
      //退出成功后清理相关数据
      commit(RESET_USER_STATE)
    } catch (error) {
      alert(error.message)
    }
  },
  //4. 清理user数据的action方法
  resetToken({ commit }) {
    commit(RESET_USER_STATE)
  },
}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
}
